From: Marco Trevisan (Treviño) Date: Fri, 5 Dec 2025 22:14:29 +0000 (+0100) Subject: environment: Ignore animation events after shutdown X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~55^2^2~16 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=d417c4d1be161a044e7aac090f4e5f1757ad16c4;p=gnome-shell.git environment: Ignore animation events after shutdown As soon as the shutdown starts, any animation event does not make sense, although during this phase the clutter timelines may still proceed and potentially calling invalid code in their callbacks. Prevent this from happening by disconnecting from any timeline signal we are connected to as soon as the `shutdown` signal is emitted Co-Authored-By: Florian Müllner Part-of: (cherry picked from commit 240aa910dc842098c843cad498572660aee0c66f) --- diff --git a/js/ui/environment.js b/js/ui/environment.js index 8cf764e95..b971ed8ae 100644 --- a/js/ui/environment.js +++ b/js/ui/environment.js @@ -18,6 +18,8 @@ import St from 'gi://St'; import * as SignalTracker from '../misc/signalTracker.js'; import {adjustAnimationTime} from '../misc/animationUtils.js'; +const sessionSignalHolder = new SignalTracker.TransientSignalHolder(); + setConsoleLogDomain('GNOME Shell'); Gio._promisify(Gio.DataInputStream.prototype, 'fill_async'); @@ -153,14 +155,16 @@ function _easeActor(actor, params) { const [transition] = transitions; if (transition && transition.delay) - transition.connect('started', () => prepare()); + transition.connectObject('started', () => prepare(), sessionSignalHolder); else prepare(); - if (transition) - transition.connect('stopped', (t, finished) => callback(finished)); - else + if (transition) { + transition.connectObject('stopped', (t, finished) => callback(finished), + sessionSignalHolder); + } else { callback(true); + } } function _easeAnimatableProperty(animatable, propName, target, params) { @@ -244,11 +248,12 @@ function _easeAnimatableProperty(animatable, propName, target, params) { transition.set_to(target); if (transition.delay) - transition.connect('started', () => prepare()); + transition.connectObject('started', () => prepare(), sessionSignalHolder); else prepare(); - transition.connect('stopped', (t, finished) => callback(finished)); + transition.connectObject('stopped', + (t, finished) => callback(finished), sessionSignalHolder); } // Add some bindings to the global JS namespace @@ -276,6 +281,9 @@ GObject.Object.prototype.disconnect_object = function (...args) { SignalTracker.registerDestroyableType(Clutter.Actor); +global.connectObject('shutdown', () => sessionSignalHolder.destroy(), + sessionSignalHolder); + Cairo.Context.prototype.setSourceColor = function (color) { const {red, green, blue, alpha} = color; const rgb = [red, green, blue].map(v => v / 255.0);